package com.example.victory.controller;
//本地

import com.example.victory.dao.RestfulResult;
import com.example.victory.entity.Dream;
import com.example.victory.entity.Person;
import com.example.victory.entity.Student;
import com.example.victory.entity.User;
import com.example.victory.service.UserService;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


//系统
//如果DAO类上面不想写@Mapper注解,可以统一配置@MapperScan在启动类中



//MapperScan告诉我们Mapper需要扫码的包，这样就不用每个Mapper上都添加@Mapper注解了
@MapperScan("com.example.victory.dao")

/*
* @RequestMapping
* 1.可以指定多个value： @RequestMapping(value={"/say","/hi"})
* @RequestMapping的Get请求获取参数的方式：

* 方式一PathVariable：访问地址中间参数传输：

  @RequestMapping(value="/{id}/say",method = RequestMethod.GET)
  public String say(@PathVariable("id") Integer id){
      return "Hello Spring Boot:"+id;
  }
*
* url访问地址可以将id中间位置：http://localhost:8080/hello/233333/say

* 方式二RequestParam：访问地址后面传值：

*   @RequestMapping(value="/say",method = RequestMethod.GET)
*   public String say(@RequestParam("id") Integer id){
*       return "Hello Spring Boot:"+id;
*   }
*
* url访问方式：http://localhost:8080/hello/say?id=110
* 添加默认值：(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) ,如何不传id，它就会默认为0。
* 3.@RequestMapping(value="/say",method = RequestMethod.GET)也可以写成GetMapping(value="/say")的方式

* **/
@RestController
/*
 *表示该controller类下所有的方法都公用的一级上下文根
 */
@RequestMapping("/user")
public class UserCenterController {

    @Autowired
    Student student;

    Mysql mysql;
    @RequestMapping("/student")
    public String showStudent() throws Exception {

        mysql = new Mysql();
        System.out.println(mysql);
        mysql.displayShelfUI();
        mysql.insertBook();

        student = new Student();
        student.setName("adviauhdfg");
        System.out.println("student:" + student);

        return student.getName();
    }


    //这里使用@RequestMapping注解表示该方法对应的二级上下文路径
    public static final String BASE_PATH = "/api/mydream";

    @RequestMapping(BASE_PATH + "/user")
    public RestfulResult<User> queryUser() {
        RestfulResult<User> response = new RestfulResult<User>();
        User user = new User();
        user.setUserName("caomigneli");
        user.setId(12);
        user.setPassWord("gfhtrh");
        user.setRealName("gsdfgfs");

        response.setCode(0);
        response.setMessage("success");
        response.setData(user);
        return response;
    }


    @RequestMapping(BASE_PATH + "/dream")
    public RestfulResult<Dream> queryDream() {
        RestfulResult<Dream> response = new RestfulResult<Dream>();
        Dream dream = new Dream();

        response.setCode(0);
        response.setMessage("success");
        response.setData(dream);
        return response;
    }



    @Autowired
    UserService userService;

    //GET的请求方式，
    @RequestMapping(value = "/getUserByGet", method = RequestMethod.GET)
    String getUserByGet(@RequestParam(value = "userName") String userName){
//        UserService userService = new UserServiceImpl();

        String result = userService.queryUserNameBuyId(1);


        System.out.println("Hello" + userName);
        return "Hello " + userName;//这里用到的注解主要有@RequestMapping表示请求的URL上下文路径，该路径不能重复，
        // 为了保证与团队其他同事写的不重复，一般会在每个controller前面加一个一级上下文目录，
        // 具体路径参数放在value后面，在每个方法前加一个二级目录，这样可以有效的避免路径冲突。
        // 还有注解是@RequestParam，该注解可以通过value指定入参，
        // 这里return的返回值就是实际的接口返回

    }

    //POST的请求方式，可以通过在@RequestMapping注解中设置method为POST来表示该请求为POST请求，除了get、post还有put、delete等请求方式，都可以通过该参数设置。
    //通过RequestMethod.POST表示请求需要时POST方式
    @RequestMapping(value = "/getUserByPost", method = RequestMethod.POST)
    String getUserByPost(@RequestParam(value = "userName") String userName){
        return "Hello " + userName;
    }

    /*
     *介绍请求参数为JSON格式的请求方法的写法
     *这里需要注意下如果请求参数是像上面那样通过url form形式提交的请求参数，
     *那么必须使用@RequestParam注解来标示参数，
     *如果使用的请求报文是POST形势的JSON串，
     *那么这里在入参的注解一定要使用@RequestBody，否则会报json解析错误。
     *在入参设置@RequestBody注解表示接收整个报文体，这里主要用在接收整个POST请求中的json报文体，
     *目前主流的请求报文也都是JSON格式了，使用该注解就能够获取整个JSON报文体作为入参，
     *使用JSON解析工具解析后获取具体参数
    */
    @RequestMapping(value = "/getUserByJson",method = RequestMethod.POST)
    String getUserByJson(@RequestBody String data){
        return "Json is " + data;
    }

    @RequestMapping(value = "/hello/{id}",method = RequestMethod.GET)
    public String say(@PathVariable Integer id){

        System.out.println("是否接收到注解：" + id);
        return "下面类纳入进spring容器中管理。这样才能被下一层@Autowired注入该对象";
    }

    @GetMapping("/user/{id}")

/*
 *@PathVariable 映射 URL 绑定的占位符
 *通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
 *@PathVariable(“xxx”) 绑定到操作方法的入参中。
 *一般与@RequestMapping(method = RequestMethod.GET)一起使用
 *@RequestMapping("/getUserById/{name}")
 *public User getUser(@PathVariable("name") String name){
 *    return userService.selectUser(name);
 *}
 *
 * 1、若方法参数名称和需要绑定的url中变量名称一致时,可以简写:

 * @RequestMapping("/getUser/{name}")
    public User getUser(@PathVariable String name){


        return userService.selectUser(name);
    }
 * 2、若方法参数名称和需要绑定的url中变量名称不一致时，写成:

 * @RequestMapping("/getUserById/{name}")
 *    public User getUser(@PathVariable("name") String userName){


 *        return userService.selectUser(userName);
 *    }
 *
 * 此时我们去掉@PathVariable发现再用postman测试发现值为空，即无法获取占位符中的参数
 * 所以这个注解就相当于是一个简单的参数传递：将路径上的参数传递到控制器接收
 */
    public String queryUserNameById(@PathVariable("id") Integer id) {

        System.out.println("接收的参数是：" + id);
        return userService.queryUserNameBuyId(id);
    }


    @RequestMapping("/index")

    @ResponseBody

    public String index(Model model) {
        Person single = new Person("aa", 11);

        User user = new User();
        user.setUserName("I'm the King!");
        List<Person> people = new ArrayList();
        Person p1 = new Person("zhangsan", 11);
        Person p2 = new Person("lisi", 22);
        Person p3 = new Person("wangwu", 33);
        people.add(p1);
        people.add(p2);
        people.add(p3);
        model.addAttribute("单人---singlePerson", single.getName());
        model.addAttribute("人类---people", p1.getName());
        model.addAttribute("用户---User desc:",user.toString());
        System.out.println(model);

        return "Hello Spring Boot!";
    }

    @RequestMapping("/list")

    @ResponseBody
    public String list(){
        System.out.println("获取list在这里");
        return "OK";
    }

    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public String queryUserNameBuyId(Integer id) {

            return "Java后端技术全栈,id=" + id.toString();
        }

    }

}


